type EventHandler<T> = (params: T) => void;

/**
 * 事件工具类
 */
class EventEmitter<E> {
  private readonly listeners: Record<keyof E, Set<EventHandler<E[keyof E]>>>;

  constructor() {
    // 初始化 listeners 为空对象
    this.listeners = {} as Record<keyof E, Set<EventHandler<E[keyof E]>>>;
  }

  /**
   * 监听事件
   * @param eventName 事件名，类型为 E 的键
   * @param listener 监听函数，其参数类型为 E[eventName]
   */
  on(eventName: keyof E, listener: EventHandler<E[keyof E]>): void {
    // 动态添加事件名和对应的监听器集合
    if (!this.listeners[eventName]) {
      this.listeners[eventName] = new Set<EventHandler<E[keyof E]>>();
    }
    this.listeners[eventName].add(listener);
  }

  /**
   * 触发事件
   * @param eventName 事件名，类型为 E 的键
   * @param params 参数，类型为 E[eventName]
   */
  emit(eventName: keyof E, params: E[keyof E]): void {
    // 触发事件，调用所有注册的监听器
    const eventListeners = this.listeners[eventName];
    if (eventListeners) {
      eventListeners.forEach(listener => listener(params));
    }
  }
}

export default EventEmitter;
